package judge.happy.number;

import java.util.HashSet;
/**
 * @Time 2019/12/15
 * @author 王光浩
 * @Need 判断一个数是否是happy数（规则为：对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和，
 *       然后重复这个过程直到这个数变为 1，也可能是无限循环但始终变不到 1。如果可以变为 1，那么这个数就是快乐数。
 * @Method 使用循环完成该题，定义一个hashset，循环的内容为判断该数是否为happy（是否为1），是的话返回true，否则将该数加入hashset
 *         中，循环结束的条件是hashset中包含该数，或者该数超过Integer的最大值。
 *         复杂度分析：时间复杂度分析——O（n^2)；空间复杂度——O（1）
 */
public class MyMethod {
    public boolean isHappy(int n) {
    	if(n==1)return true;
        HashSet<Long> set=new HashSet<Long>();       //保存所有已经判断过的值
        String tem;                                         
        int len;
        long result=n;
        //集合的contains的时间复杂度为O（n）
        while(result<=Integer.MAX_VALUE && !set.contains(result)) {
        	//判断是否为快乐数
        	if(result==1)
        		return true;
        	//将数字加入到hashset中
        	set.add(result);
        	//获得下一个数字
        	tem=String.valueOf(result);
        	len=tem.length();
        	result=0;
        	for(int i=0;i<len;i++) {
        		result+=Math.pow((int)tem.charAt(i)-48, 2);
        	}
        }
        return false;
    }
}
